﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Hybrid.Threading.Sync
{
    class SimpleHybridLock:IDisposable
    {
        //使用基元用户模式构造
        private int m_waiters = 0;

        //使用基元内核模式构造
        private AutoResetEvent m_waiterLock = new AutoResetEvent(false);

        public void Enter()
        {
            //指出这个线程想要获得锁
            if (Interlocked.Increment(ref m_waiters) == 1)
            {
                return;//锁可以自由使用,无竞争,直接返回
            }
            //另一个线程正在等待.这代表一个竞争,因此阻塞这个线程
            m_waiterLock.WaitOne();//这里产生较大的性能影响
            //WaitOne返回后,这个线程现在拥有了锁
        }

        public void Leave()
        {
            //这个线程准备释放锁
            if (Interlocked.Decrement(ref m_waiters) == 0)
            {
                return;//没有其他线程阻塞,直接返回
            }

            //有其他线程正在阻塞,唤醒其中一个
            m_waiterLock.Set();//这里产生较大的性能影响
        }

        #region IDisposable 成员

        public void Dispose()
        {
            m_waiterLock.Dispose();
        }

        #endregion
    }
}
